import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.google.gson.JsonArray;
import manager.UserManager;
import manager.DishManager;
import manager.OrderManager;
import model.Order;
import model.OrderItem;
import model.Dish;
import java.util.ArrayList;
import java.util.List;

/**
 * Java后端通信处理类
 * 通过监听request.json请求文件，解析请求，调用manager方法处理，写入response.json响应文件
 */
public class CommunicationHandler {

    private static final String REQUEST_FILE = "data/request.json";
    private static final String RESPONSE_FILE = "data/response.json";

    private UserManager userManager;
    private DishManager dishManager;
    private OrderManager orderManager;
    private Gson gson;

    public CommunicationHandler() {
        userManager = new UserManager();
        dishManager = new DishManager();
        orderManager = new OrderManager();
        gson = new Gson();
    }

    /**
     * 处理请求，调用此方法即可
     */
    public void handleRequest() {
        String reqJson = util.FileUtil.readFile(REQUEST_FILE);
        if (reqJson.isEmpty()) {
            return;
        }

        JsonObject reqObj = gson.fromJson(reqJson, JsonObject.class);
        String action = reqObj.get("action").getAsString();
        JsonObject response = new JsonObject();

        try {
            switch (action) {
                case "register":
                    //获取username键的值并转换为字符串
                    String regUsername = reqObj.get("username").getAsString();
                    String regPassword = reqObj.get("password").getAsString();
                    boolean regResult = userManager.register(regUsername, regPassword);
                    //响应文件里面添加结果
                    response.addProperty("result", regResult);
                    break;

                case "login":
                    String loginUsername = reqObj.get("username").getAsString();
                    String loginPassword = reqObj.get("password").getAsString();
                    boolean loginResult = userManager.login(loginUsername, loginPassword);
                    response.addProperty("result", loginResult);
                    break;

                case "getDishes":
                    response.add("dishes", gson.toJsonTree(dishManager.getAllDishes()));
                    break;

                case "addDish":
                    String dishName = reqObj.get("name").getAsString();
                    double dishPrice = reqObj.get("price").getAsDouble();
                    dishManager.addDish(dishName, dishPrice);
                    response.addProperty("result", true);
                    break;
                case "editDish":
                    int editDishId = reqObj.get("id").getAsInt();
                    String newName = reqObj.get("name").getAsString();
                    double newPrice = reqObj.get("price").getAsDouble();
                    boolean editResult = dishManager.editDish(editDishId, newName, newPrice);
                    response.addProperty("result", editResult);
                    break;
                case "deleteDish":
                    int delDishId = reqObj.get("id").getAsInt();
                    boolean delResult = dishManager.deleteDish(delDishId);
                    response.addProperty("result", delResult);
                    break;

                case "getOrders":
                    // 创建一个用于存放所有订单信息的 JSON 数组
                    JsonArray ordersArray = new JsonArray();

                    // 遍历订单管理器中保存的所有订单对象
                    for (Order order : orderManager.getAllOrders()) {
                        // 创建一个 JSON 对象用于表示单个订单
                        JsonObject orderJson = new JsonObject();

                        // 将订单编号（id）加入 JSON 对象
                        orderJson.addProperty("id", order.getId());

                        // 将下单用户名加入 JSON 对象
                        orderJson.addProperty("username", order.getUsername());

                        // 将订单当前状态（如“待处理”、“已完成”等）加入 JSON 对象
                        orderJson.addProperty("status", order.getStatus());

                        // 创建一个 JSON 数组用于存放该订单的菜品明细
                        JsonArray itemsArray = new JsonArray();

                        // 遍历订单中包含的所有菜品项（OrderItem）
                        for (OrderItem item : order.getItems()) {
                            // 根据菜品 ID 从菜品管理器中获取对应的菜品对象
                            Dish dish = dishManager.getDishById(item.getDishId());

                            // 如果找到了对应的菜品（避免菜品被删除但订单未更新的情况）
                            if (dish != null) {
                                // 创建一个 JSON 对象用于表示单个菜品项
                                JsonObject itemJson = new JsonObject();

                                // 添加菜品名称
                                itemJson.addProperty("dishName", dish.getName());

                                // 添加该菜品在订单中被点的数量
                                itemJson.addProperty("quantity", item.getQuantity());

                                // 将菜品项对象添加到菜品数组中
                                itemsArray.add(itemJson);
                            }
                        }

                        // 将完整的菜品数组加入到订单对象中
                        orderJson.add("items", itemsArray);

                        // 将当前订单对象添加到总的订单数组中
                        ordersArray.add(orderJson);
                    }

                    // 最终将所有订单信息添加到响应 JSON 中，键名为 "orders"
                    response.add("orders", ordersArray);

                    // 结束 switch 的当前 case 逻辑
                    break;



                case "addOrder":
                    String username = reqObj.get("username").getAsString();
                    List<OrderItem> items = new ArrayList<>();
                    for (var item : reqObj.getAsJsonArray("items")) {
                        OrderItem oi = gson.fromJson(item, OrderItem.class);
                        items.add(oi);
                    }
                    Order order = new Order(0, username, items, "未完成");
                    orderManager.addOrder(order);
                    response.addProperty("result", true);
                    break;

                case "updateOrderStatus":
                    int updateOrderId = reqObj.get("id").getAsInt();
                    boolean updateResult = orderManager.updateOrderStatus(updateOrderId, "done");
                    response.addProperty("result", updateResult);
                    break;

                default:
                    response.addProperty("error", "未知操作");
                    break;
            }
        } catch (Exception e) {
            response.addProperty("error", e.getMessage());
        }

        // 写响应文件
        util.FileUtil.writeFile(RESPONSE_FILE, gson.toJson(response));

        // 处理完毕，清空请求文件，避免重复处理
        util.FileUtil.writeFile(REQUEST_FILE, "");
    }

    /**
     * 后台持续监听请求文件
     */
    public static void main(String[] args) {
        CommunicationHandler handler = new CommunicationHandler();
        System.out.print("后端已开始运行......");
        while (true) {
            handler.handleRequest();

            try {
                Thread.sleep(300); // 每300ms检测一次
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
